package cn.zero.letaomallspringboot.common;

import cn.zero.letaomallspringboot.Constant.ResultCode;
import lombok.Data;
import static cn.zero.letaomallspringboot.Constant.ResultCode.*;
@Data
public class Result<T> {
    /** 执行结果：true=成功，false=失败 */
    private boolean success;
    /** 状态码：参考 ResultCode 枚举 */
    private Integer code;
    /** 业务数据：成功时返回，失败时可为null */
    private T data;
    /** 提示信息：失败时返回错误原因，成功时可返回友好提示 */
    private String msg;
    /** 异常追踪ID：用于生产环境定位异常日志 */
    private String traceId;
    /** 异常详情：仅开发/测试环境返回（如堆栈信息） */
    private String errorDetail;


    // ------------------- 静态工厂方法（便捷构造） -------------------
    /** 成功：无数据，默认提示 */
    public static <T> Result<T> success() {
        Result<T> result = new Result<>();
        result.setSuccess(true);
        result.setCode(SUCCESS.getCode());
        result.setMsg(SUCCESS.getMsg());
        return result;
    }

    /** 成功：带业务数据，默认提示 */
    public static <T> Result<T> success(T data) {
        Result<T> result = success();
        result.setData(data);
        return result;
    }

    /** 成功：带业务数据+自定义提示 */
    public static <T> Result<T> success(T data, String msg) {
        Result<T> result = success(data);
        result.setMsg(msg);
        return result;
    }

    /** 失败：按枚举指定错误（默认提示） */
    public static <T> Result<T> fail(ResultCode resultCode) {
        Result<T> result = new Result<>();
        result.setSuccess(false);
        result.setCode(resultCode.getCode());
        result.setMsg(resultCode.getMsg());
        return result;
    }

    /** 失败：按枚举指定错误+自定义提示 */
    public static <T> Result<T> fail(ResultCode resultCode, String msg) {
        Result<T> result = fail(resultCode);
        result.setMsg(msg);
        return result;
    }

    /** 失败：带异常追踪信息（生产环境用） */
    public static <T> Result<T> fail(ResultCode resultCode, String traceId, String errorDetail) {
        Result<T> result = fail(resultCode);
        result.setTraceId(traceId);
        // 生产环境可注释此行，避免泄露敏感信息
        result.setErrorDetail(errorDetail);
        return result;
    }

    /** 失败：按指定错误码和错误信息（默认提示） */
    public static <T> Result<T> fail(Integer code, String msg) {
        Result<T> result = new Result<>();
        result.setSuccess(false);
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

    // 在 Result 类中新增方法
    public static <T> Result<T> fail(ResultCode resultCode, Object... formatArgs) {
        Result<T> result = new Result<>();
        result.setSuccess(false);
        result.setCode(resultCode.getCode());
        String message = formatArgs.length > 0
                ? String.format(resultCode.getMsg(), formatArgs)
                : resultCode.getMsg();
        result.setMsg(message);
        return result;
    }
}
